package com.hmdp.service.impl;

import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.hmdp.dto.Result;
import com.hmdp.entity.ShopType;
import com.hmdp.mapper.ShopTypeMapper;
import com.hmdp.service.IShopTypeService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hmdp.utils.SystemConstants;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 虎哥
 * @since 2021-12-22
 */
@Service
public class ShopTypeServiceImpl extends ServiceImpl<ShopTypeMapper, ShopType> implements IShopTypeService {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public List<ShopType> queryForList() {
        // 1.从redis中查询商铺种类缓存(这里商铺种类信息的值采用String类型,分层结构，通过模糊查询寻找所有相关key)
        // 1.1先获取keySet(Redis: KEYS SHOP_TYEP_KEY_PRE*....)
        Set<String> keys = stringRedisTemplate.keys(SystemConstants.SHOP_TYEP_KEY_PRE + "*");
        List<ShopType> shopTypeList = null;
        if(keys != null){
            shopTypeList = new ArrayList<>();
            // 1.2根据keySet来逐个寻找商铺种类信息
            for(String key : keys){
                String shopTypeJson = stringRedisTemplate.opsForValue().get(key);
                // 2.判断商铺种类是否存在
                // 将String转换成ShopType
                if(StrUtil.isNotBlank(shopTypeJson)){
                    // 3.redis存在商铺种类信息，将从redis取到的HashMap转为ShopType类型，借助hutool工具插件
                    ShopType shopType = JSONUtil.toBean(shopTypeJson, ShopType.class);
                    shopTypeList.add(shopType);
                }
            }
        } else{
            // 4.redis不存在商铺种类信息，查询数据库select * from tb_shop_type order by sort asc
            shopTypeList = query().orderByAsc("sort").list();
            // 5.数据库不存在商铺种类信息，返回错误信息
//            return Result.fail("商铺种类暂未存储在数据库中!");
            // 6.数据库存在商铺种类信息，将商铺种类信息写入到redis中(从集合中取出ShopType对象，然后转成字符串，逐条存放)
            if(shopTypeList != null){
                for(int i = 0; i < shopTypeList.size(); i++){
                    ShopType st = shopTypeList.get(i);
                    String json_st = JSONUtil.toJsonStr(st);
                    //尾编号为shopType中的sort属性值
                    stringRedisTemplate.opsForValue().set(SystemConstants.SHOP_TYEP_KEY_PRE + st.getSort(), json_st);
                }
            }
        }
        // 7.返回
        return shopTypeList;
    }
}
